package br.com.helpdesk.controller;

//import Configuration;

import java.util.List;

//import org.hibernate.Criteria;
//import org.hibernate.Hibernate;
import org.hibernate.Session;
//import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import br.com.helpdesk.model.Usuario;
import br.com.helpdesk.controller.HibernateUtil;

/**
 * @author Abimael
 *
 */

public class DaoHelper<ObjClasse> implements IMetodos {

	private Session sessao 	  = null;	
	private Transaction trans = null;
	private ObjClasse objClasse;

	public DaoHelper(ObjClasse objClasse) {
		
		//this.session =  HibernateUtil.getSessionFactory(); 
		this.sessao = HibernateUtil.getSession();
		this.objClasse = objClasse;
	}

	@Override
	public boolean inserir() {
		boolean resultado = false;
		try{
			this.trans =  sessao.beginTransaction();
			sessao.save(objClasse);
			trans.commit();
			resultado = true;
		}catch(Exception ex){
			trans.rollback();
			ex.printStackTrace();			
		}
		return resultado;
	}

	@Override
	public void gravar() {		
		try{
			@SuppressWarnings("unused")
			boolean resultado = false;
			this.trans =  sessao.beginTransaction();
			sessao.save(objClasse);
			trans.commit();
			resultado = true;
		}catch(Exception ex){
			trans.rollback();
			ex.printStackTrace();			
		}
		//return resultado;
	}	
	
	@Override
	public boolean alterar() {
		boolean resultado = false;
		try{
			this.trans = sessao.beginTransaction();
			sessao.update(objClasse);
			trans.commit();
			resultado = true;
		}catch(Exception ex){
			trans.rollback();
			ex.printStackTrace();			
		}
		return resultado;
	}
	
	@Override
	public boolean excluir() {
		boolean resultado = false;
		try{
			this.trans = sessao.beginTransaction();
			sessao.delete(objClasse);
			trans.commit();
			resultado = true;
		}catch(Exception ex){
			trans.rollback();
			ex.printStackTrace();			
		}
		return resultado;
	}

	@SuppressWarnings("rawtypes")
	@Override
	public List getListar() {
		List lista = sessao.createQuery("from "+objClasse.getClass().getName()).list();
		return lista;		
	}
		
	public Usuario efetuaLogin(Usuario form) { 
		Usuario usuario = null;				
		try { 						
				usuario = (Usuario) sessao.createCriteria(Usuario.class)		
				.add(Restrictions.eq("login", form.getLogin())) 
				.add(Restrictions.eq("senha", form.getSenha()))
				.uniqueResult();
		} catch (Exception ex) { 
			 System.out.println("Erro ao conectar " + ex.getMessage()); 
			 sessao.close(); 
		} finally { 
			 if (sessao != null) { 
				 sessao.close(); 
			 } 
		} 
		return usuario; 		
	}
}